#ifndef MESSAGE_DISPATCHER_HPP
#define MESSAGE_DISPATCHER_HPP

////////////////////////////////////////////////////////////
// Headers
////////////////////////////////////////////////////////////
#include <set>

#include <SFML/System/Clock.hpp>
#include <SmegTools/Pattern/Singleton.hpp>

#include "MessageInfo.hpp"

#include <SmegTools/Debug/DebugNew.hpp>

namespace smeg {
    namespace core {

class BaseObject;

////////////////////////////////////////////////////////////
// Class managing the dispatching of message
////////////////////////////////////////////////////////////
class MessageDispatcher : public tools::Singleton< MessageDispatcher >
{
    DECLARE_SINGLETON( MessageDispatcher )

    typedef std::set< MessageInfo >     td_MessageSet;
public:
    ////////////////////////////////////////////////////////////
    /// Change the state of the entity
    ///
    ////////////////////////////////////////////////////////////
    void            DispatchMessage(    float _fDelay,
                                        BaseObject* _pSender,
                                        BaseObject* _pReceiver,
                                        int _iMessageType,
                                        void* _pExtraInfo = NULL );

    ////////////////////////////////////////////////////////////
    /// Update the message dispatcher, send message info that need sending
    ///
    ////////////////////////////////////////////////////////////
    void            Update();
    
private:
    ////////////////////////////////////////////////////////////
    /// Discharge a message to its receiver
    ///
    ////////////////////////////////////////////////////////////
    void            Discharge( BaseObject* _pReceiver, const MessageInfo& _msg );

    sf::Clock       m_Clock;
    td_MessageSet   m_MessageQueue;
};

    } // namespace core
} // namespace smeg

#include <SmegTools/Debug/DebugNewOff.hpp>

#endif // MESSAGE_DISPATCHER_HPP